/**
 * SPDX-FileCopyrightText: 2023-2025 Sangfor Technologies Inc.
 * SPDX-License-Identifier: Mulan PSL v2
 */
/*
 *  create by zjy 20190418
 *  用途：集群详情页面的内存的单位转换，以及小数的减法计算
 */
const BYTENUM = 1024;
const ORDER10 = 10;
const ORDER2 = 2;

function subNum (num1: number, num2: number): number {

    // // 先做格式转换，再去相减
    // let parNum1 = parseIntOrZero(num1);
    // let parNum2 = parseIntOrZero(num2);

    return formattedNum(num1 - num2);
}

/*
* @params{size} 需要被格式化的大小
* @params{type} 需要被格式化的单位，只支持填 ['bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']，其他默认为 bytes
*
* */
type SizeUnit = 'bytes' | 'EB' | 'GB' | 'KB' | 'MB' | 'PB' | 'TB' | 'YB' | 'ZB'
interface SizeFormatResult {
    formatSize: number
    unit: SizeUnit,
    bytesSize: number | undefined,
    toString: () => string
}
function getFileSize (size: number, type: SizeUnit): SizeFormatResult {
    let symbols = ['bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
    let bytesSize;

    // 判断传进来的是否为数字
    size = parseFloat(String(size));
    if (Number.isNaN(size)) {

        // 默认值
        return {
            formatSize: 0,
            unit: symbols[0] as SizeUnit,
            bytesSize: 0,
            toString: () => 0 + symbols[0]
        };
    }

    // 如果传了type值的话，统一转化为bytes
    if (type) {
        let index = symbols.findIndex((v) => {
            return v === type;
        });
        if (index > -1) {
            size = bytesSize = Number((size * Math.pow(ORDER2, ORDER10 * index)).toFixed(1));
        }
    }

    // exp 为指数， bytes以2为底的指数
    let exp = Math.floor(Math.log(size) / Math.log(ORDER2));
    if (exp < 1) {
        exp = 0;
    }

    // i 直接对应着symbols 的下标对应的单位
    let i = Math.floor(exp / ORDER10);
    size = size / Math.pow(ORDER2, ORDER10 * i);

    // 保留1位小数
    if (size.toString().length > size.toFixed(1).toString().length) {
        size = formattedNum(size);
    }

    // 返回值为一个对象
    return {
        formatSize: size,       // 格式化后的值
        unit: symbols[i] as SizeUnit,        // 格式化之后的单位
        bytesSize: bytesSize,
        toString: () => size + symbols[i]
    };
}

function parseFileSize (size: number): number {

    // 把内存为 K-->转换为 G
    let changeG = size / Math.pow(BYTENUM, ORDER2);
    return formattedNum(changeG);
}

function parseIntOrZero (num: number): number {
    let sizeNum = parseFileSize(num);
    let parseNum = sizeNum || 0;
    return parseNum;
}

// 格式化数字成保留一个小数点
function formattedNum (num: number, several = 1): number {
    return Number(parseFloat(String(num)).toFixed(several));
}

export {
    subNum,
    parseIntOrZero,
    formattedNum,
    getFileSize
};
